/**
 * @file    inf_airbag.h
 * @author  yhy
 * @brief   气袋模块头文件
 * @version 1.00
 * @date    2025-07-29
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __INF_AIRBAG_H__
#define __INF_AIRBAG_H__

#include "common_config.h"
#include "inf_solenoid_valve.h"

#include <stdbool.h>
#include <stdint.h>

/**
 * @brief 气袋状态
 *
 */
typedef enum
{
    AIRBAG_STATE_UNKNOWN = 0U, /*!< 气袋未知状态, 用于状态返回错误的情况 */
    AIRBAG_STATE_INFLATE = 1U, /*!< 气袋充气状态 */
    AIRBAG_STATE_DEFLATE = 2U, /*!< 气袋泄气状态 */
    AIRBAG_STATE_KEEP    = 3U, /*!< 气袋保压状态（充气、泄气阀都关闭） */
    AIRBAG_STATE_EXHAUST = 4U, /*!< 气袋抽气状态 */
    AIRBAG_STATE_MAX,
} airbag_state_e;

/**
 * @brief 气袋结构体，一个气袋拥有一个结构体对象
 *
 */
typedef struct
{
    solenoid_valve_channel_e inflate_valve_ch;    /*!< 充气阀门通道 */
    solenoid_valve_channel_e deflate_valve_ch;    /*!< 泄气阀门通道 */
    uint32_t                 inflate_time_ms;     /*!< 充气时间，单位ms */
    uint32_t                 max_inflate_time_ms; /*!< 最大充气时间，单位ms */
    uint16_t                 inflate_rate_ms;     /*!< 充气速率，单位ms */
    uint16_t                 deflate_rate_ms;     /*!< 泄气速率，单位ms */
    airbag_state_e           state;               /*!< 气袋状态 */
    uint32_t                 air_pressure;        /*!< 气袋压力，单位KPa */
    bool                     inflate_blocked;     /*!< 充气阻塞标志位(充满) */
} airbag_t;

result_e       inf_airbag_init(airbag_t *airbag, solenoid_valve_channel_e inflate_ch,
                               solenoid_valve_channel_e deflate_ch, uint32_t max_inflate_time_ms,
                               uint16_t inflate_rate_ms, uint16_t deflate_rate_ms);
result_e       inf_airbag_set_state(airbag_t *airbag, airbag_state_e state);
airbag_state_e inf_airbag_get_state(const airbag_t *airbag);
uint16_t       inf_airbag_get_air_pressure(const airbag_t *airbag);

#endif
